﻿
#ifndef FILEOPERATION_H
#define FILEOPERATION_H

#include <QObject>
#include <Qvariant>
#include "Structs.h"

///**
// * @brief The TopicInfoStrc class 主题信息
// */
//struct TopicInfoStrc{
//    //! 主题id
//    int topic_id;
//    //! 主题名称
//    QString topic_name;
//    //! 主题长度
//    int topic_length;
//    //! 信号Id列表
//    QList<int> signal_id_list;
//};

///**
// * @brief The SignalInfoStrc class 信号信息
// */
//struct SignalInfoStrc{
//    //! 信号id
//    int signal_id;
//    //! 信号名称
//    QString signal_name;
//    //! 信号数据类型索引
//    int data_type_index;
//    //! 字偏移
//    int offset_byte;
//    //! 位偏移
//    int offset_bit;
//    //! 信号长度
//    int signal_length;
//    //! 信号精度
//    int signal_accuracy;
//    //! 单位
//    QString unit;
//    //! 最大值
//    float max_value;
//    //! 最小值
//    float min_value;
//    //! 备注
//    QString remark;
//};

///**
// * @brief The StructInfoStrc class 结构体信息
// */
//struct StructuralInfoStrc{
//    //! 结构体Id
//    int struct_id;
//    //! 结构体名称
//    QString struct_name;
//    //! 结构体长度
//    int struct_length;
//    //! 信号Id列表
//    QList<int> signal_id_list;
//};

///**
// * @brief The EnumInfoStrc class 枚举信息
// */
//struct EnumInfoStrc{
//    //! 枚举Id
//    int enum_id;
//    //! 枚举名称
//    QString enum_name;
//    //! 枚举位长
//    int enum_bit_length;
//    //! 键值对
//    QMap<QVariant,QVariant> enum_content;
//};

/**
 * @brief The ResultCode enum 文件操作结果码
 */
enum ResultCode{
    //! 操作成功
    Success,
    //! 操作的原主题不存在
    Topic_Non_Exists,
    //! 主题Id存在重复
    Topic_Id_Exists,
    //! 主题名称存在重复
    Topic_Name_Exists,
    //! 结构体Id存在重复
    Struct_Id_Exists,
    //! 结构体名称存在重复
    Struct_Name_Exists,
    //! 信号Id存在重复
    Signal_Id_Exists,
    //! 信号名称存在重复
    Signal_Name_Exists,
    //! 枚举Id存在重复
    Enum_Id_Exists,
    //! 枚举名称存在重复
    Enum_Name_Exists
};

//! 消息所属父级类型
enum ParentType{
    //! 主题
    TopicMsg,
    //! 结构体
    StructMsg
};

class FileOperation : public QObject
{
    Q_OBJECT
public:
    explicit FileOperation(QObject *parent = nullptr);

signals:

public:
    /**
     * @brief addTopic 添加主题
     * @param topicId 主题id
     * @param topicName 主题名称
     */
    void addTopic(int &topicId, QString &topicName);
    /**
     * @brief deleteTopic 删除主题
     * @param topicId 主题Id
     */
    void deleteTopic(const QVariant &topicId);
    /**
     * @brief addStruct 添加结构体
     * @param structId 结构体id
     * @param StructName 结构体名称
     */
    void addStruct(int &structId, QString &StructName);
    /**
     * @brief deleteStruct 删除结构体
     * @param topicId 结构体Id
     */
    void deleteStruct(const QVariant &structId);
    /**
     * @brief topicCellValueChanged 主题单元格的值改变
     * @param rowId 行Id
     * @param columnIndex 列索引
     * @param value 改变后的值
     * @return 文件操作结果码
     */
    ResultCode topicCellValueChanged(const QVariant &rowId, const int columnIndex,const QVariant &value);    /**
     * @brief signalCellValueChanged 信号单元格的值改变
     * @param rowId 行Id
     * @param columnIndex 列索引
     * @param value 改变后的值
     * @return 文件操作结果码
     */
    ResultCode signalCellValueChanged(const QVariant &rowId, const int columnIndex,const QVariant &value);
    /**
     * @brief FileOperation::addSignal 添加信号
     * @param topicId 所属主题Id
     * @return 该信号的信息
     */
    QVector<QVariant> addSignal(const QVariant &topicId);
    /**
     * @brief deleteSignal 删除信号
     * @param topicId 主题Id
     * @param signalId 信号Id
     */
    void deleteSignal(const int &topicId, const QVariant &signalId);
    /**
     * @brief getTopicRowData 获取主题行数据
     * @param rowId 行Id
     * @return 该行Id的整行数据
     */
    QVector<QVariant> getTopicRowData(const QVariant &rowId);
    /**
     * @brief getSignalRowData 获取信号行数据
     * @param rowId 行Id
     * @return 该行Id的整行数据
     */
    QVector<QVariant> getSignalRowData(const QVariant &rowId);
    /**
     * @brief LoadSignalInfo 加载信号信息
     * @param type 信号所属父级的类型
     * @param selectId 父级所选的Id（主题Id或结构体Id）
     */
    void LoadSignalInfo(ParentType type, const QVariant &selectId);

private:
    //! 主题Id和主题信息的集合
    QMap<int,MsgData> m_TopicId_InfoMap;
    //! 主题名称和主题Id的集合
    QMap<QString,int> m_TopicName_IdMap;

    //! 信号Id和信号信息集合
    QMap<int,SignalData> m_SignalId_InfoMap;
    //! 信号名称和信号Id集合
    QMap<QString,int> m_SignalName_IdMap;

    //! 结构体Id和结构体信息的集合
    QMap<int,SignalData> m_StructId_InfoMap;
    //! 结构体名称和结构体Id的集合
    QMap<QString,int> m_StructName_IdMap;

};

#endif // FILEOPERATION_H
